package com.linkgie.galaxyframework.web;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * HTTP服务回复数据的处理设置；
 * <p>
 * 声明由 {@link HttpService} 标注的 Controller 的请求方法的返回结果的 JSON 序列化处理，通过此标注可以设置实际返回的
 * {@link ServiceResponse } 对象；
 * <p>
 * 注：如果 Controller 的请求方法已经显式地声明为 {@link ServiceResponse } 类型时，此标注不生效；
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ServiceResponseBody {

	/**
	 * 使用方法声明的返回值类型作为输出的数据类型；
	 * <p>
	 * 默认为 true ；
	 * 
	 * <p>
	 * 通过 {@link #dataType} 属性显式声明的类型的优先级更高；
	 * 
	 * @return
	 */
	boolean useDeclaringType() default true;

	/**
	 * 方法回复数据的类型；
	 * <p>
	 * 针对 Spring Controller 方法声明的返回数据，
	 * <p>
	 * 当显式指定一个类型时， JSON 序列化输出返回结果时，忽略返回数据中不包含在指定类型中的字段；
	 * 
	 * @return
	 */
	Class<?> dataType() default Void.class;

	/**
	 * 是否在序列化时输出数据类型；
	 * 
	 * @return
	 */
	boolean outputDataType() default false;

}
